package main

import (
	"bufio"
	"fmt"
	"net"
	"os"
)

// runUDPClient 通过 UDP 直接向服务器发送报文；无需握手，双方只需约定地址与端口。
func runUDPClient() error {
	serverAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:7070")
	if err != nil {
		return fmt.Errorf("resolve server addr: %w", err)
	}

	// 本地地址使用 nil 让系统自动分配端口
	conn, err := net.DialUDP("udp", nil, serverAddr)
	if err != nil {
		return fmt.Errorf("dial udp: %w", err)
	}
	defer conn.Close()

	fmt.Println("[udp-client] connected logically (no handshake). Try: PING / TIME / text / Ctrl+C")

	reader := bufio.NewReader(os.Stdin)
	buf := make([]byte, 1024)

	for {
		fmt.Print("> ")
		text, err := reader.ReadString('\n')
		if err != nil {
			return fmt.Errorf("read stdin: %w", err)
		}

		if _, err := conn.Write([]byte(text)); err != nil {
			return fmt.Errorf("write udp: %w", err)
		}

		// UDP 是无连接的，但 DialUDP 仍然允许我们使用 Read 读取服务器响应
		n, _, err := conn.ReadFromUDP(buf)
		if err != nil {
			return fmt.Errorf("read reply: %w", err)
		}

		fmt.Printf("[udp-client] reply: %s\n", string(buf[:n]))
	}
}

func main() {
	if err := runUDPClient(); err != nil {
		fmt.Println("udp client error:", err)
	}
}
